package upcweb.dao;

import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.ArrayList;

import upcweb.modelo.ClsClub;
import upcweb.modelo.ClsCotizacion;
import upcweb.modelo.ClsServicio;
import upcweb.modelo.ClsSolicitud;
import upcweb.util.ClsReturn;

public class CotizacionDAO {

	SQLProcDAO sqlDAO = new SQLProcDAO();
	
	
	public boolean isEmpty(String str){
		if (str==null){
			return true;
		}
		if(str.trim().isEmpty()){
			return true;
		}
		return false;
	}
	
	public ArrayList<ClsCotizacion> filterCotizaciones(ClsCotizacion cot){
		ArrayList<ClsCotizacion> arr = new ArrayList<ClsCotizacion>();
		String sql= "select a.nu_solicitud, co_estado,fe_solicitud,no_club,concat(concat(no_responsable,' '),ape_paterno) nombres," +
" a.qt_personas, a.co_club, (select count(*) from solicitudservicio c" +
" where c.nu_solicitud = a.nu_solicitud) items from vCotizacion as a inner" +
" join club as b on a.co_club = b.co_club inner join responsablefamilia as d" +
" on d.co_responsable = a.co_responsable" +
" where 1 = 1 ";
				
		if (!isEmpty(cot.getNo_Responsable())){
			sql+=" and (concat(concat(concat(concat(no_responsable,' '),ape_PATERNO),' '),ape_materno)) like '%"+cot.getNo_Responsable()+"%'";
		}
		if (!isEmpty(cot.getFec_Inicio())){
			sql+=" and fe_solicitud >= '" + cot.getFec_Inicio() + "'";
		}
		if (!isEmpty(cot.getFec_Final())){
			sql+=" and fe_solicitud <= '" + cot.getFec_Final()+"'";
		}
		if (cot.getCo_club()>0){
			sql+=" and a.co_club = "+cot.getCo_club();
		}
		sql+=" group by a.nu_solicitud, co_estado,fe_solicitud,no_club," +
" a.qt_personas, a.co_club";
		System.out.println(sql);
		ResultSet rs = sqlDAO.getData(sql, new Object[]{});	
		try {
			while(rs.next()){
				ClsCotizacion obj = new ClsCotizacion();
				obj.setNu_solicitud(rs.getInt("nu_solicitud"));
				obj.setFe_solicitud(rs.getDate("fe_solicitud"));
				obj.setCo_club(rs.getInt("co_club"));
				obj.setUsuario(rs.getString("nombres"));
				obj.setQt_personas(rs.getInt("qt_personas"));
				obj.setNo_club(rs.getString("no_club"));
				arr.add(obj);
			}
		} catch (Exception e) {
			// TODO: handle exception
			System.err.println(e.getMessage());
		}
		return arr;
	}
	
	
	
	public ArrayList<ClsClub> getClub(){
		ArrayList<ClsClub> clubs= new ArrayList<ClsClub>();
		try {
			ResultSet rs = sqlDAO.getData("select * from club where fl_activo = '1'", new Object[]{});
			while(rs.next()){
				ClsClub obj = new ClsClub();
				obj.setNo_club(rs.getString("no_club"));
				obj.setCo_club(rs.getInt("co_club"));
				clubs.add(obj);
			}
		} catch (Exception e) {
			// TODO: handle exception
			System.err.println(e.getMessage());
		}
		return clubs;
	}
	
	public ClsReturn delItem(ClsServicio serv){
		ClsReturn ret = new ClsReturn();
	try {
		ret = sqlDAO.execProc("{call sp_del_servicio(?,?)}",
				new Object[]{serv.getNo_Solicitud(),serv.getIdService()});
//		if (ret.getRows()>0){
//			System.out.println("Se ha quitado el Registro de Servicio");
//			return true;
//		}
//		System.err.println("No se procesaron registros.");
//		return false;
	} catch (Exception e) {
		// TODO: handle exception
		return new ClsReturn(e);
	}	
	return ret;
	}
	
	public ClsReturn editItem(ClsServicio serv){
		ClsReturn ret = new ClsReturn();
		try {
			//erv int, mon decimal(10,2), per int, txt varchar(200), sol int
			 ret = sqlDAO.execProc("{call sp_edit_servicio(?,?,?,?,?)}", 
					new Object[]{
					serv.getIdService(), serv.getCostPerPerson(),serv.getMinParticipants(),
					serv.getDescription(),serv.getNo_Solicitud()
			});			
//			if (ret.getRows()>0){
//				System.out.println("Se ha editado el registro.");
//				return true;
//			}
//				else{
//					System.err.println("No se han encontrado registros para editar");
//					return false;
//			}
		} catch (Exception e) {
			// TODO: handle exception
			return new ClsReturn(e);
		}
		return ret;
	}
	
	public ClsReturn addItem(ClsServicio serv){
		ClsReturn ret = new ClsReturn();
		try {
			//erv int, mon decimal(10,2), per int, txt varchar(200), sol int
			ret = sqlDAO.execProc("{call sp_add_servicio(?,?,?,?,?)}", 
					new Object[]{
					//serv int, mon decimal(10,2), per int, txt varchar(200), sol int
					serv.getIdService(),serv.getCostPerPerson(),serv.getMinParticipants(),
					serv.getObservaciones(),serv.getNo_Solicitud() 
			});			
			
		} catch (Exception e) {
			// TODO: handle exception
			return new ClsReturn(e);
		}
		return ret;
	}
	
	public ClsReturn setCheckCotizado(ClsCotizacion cot){
		ClsReturn ret = new ClsReturn();
		try {
			//erv int, mon decimal(10,2), per int, txt varchar(200), sol int
			ret = sqlDAO.execProc("{call sp_set_cotizado(?)}", 
					new Object[]{cot.getNu_solicitud()});													
			
		} catch (Exception e) {
			// TODO: handle exception
			return new ClsReturn(e);
		}
		return ret;
	}
	
	public ClsReturn generarCotizacion(ClsCotizacion clsCot, ArrayList<ClsServicio> clsSer){
		ClsReturn ret = new ClsReturn(false);
		try {
			String[] clsObj = sqlDAO.execProc("{call sp_add_gen_sol(?,?,?,?,?)}", 
					new Object[]{clsCot.getCo_club(),clsCot.getQt_personas(),clsCot.getCo_responsable()
					,clsCot.getTxt_observaciones()},1); // Devuelve Nro de Solicitud o -1
			int sol = Integer.parseInt(clsObj[0]);
			if (sol>0){ // Se genero la soicitud
				// Agregar los servicios
				for(ClsServicio serv : clsSer){
				ClsReturn ret2 = sqlDAO.execProc("{call sp_add_serv_sol(?,?,?,?,?)}",
						new Object[]{sol,serv.getIdService(),serv.getCostPerPerson(),serv.getMinParticipants()
						,serv.getDescription()});
				}
			}
		} catch (Exception e) {
			// TODO: handle exception
			ret = new ClsReturn(e);
		}
		return ret;
	}
	
/*	public ClsCotizacion getCotizacion(int nro_sol){
		ClsCotizacion clsCot = new ClsCotizacion();
		ArrayList<ClsServicio> clsSer = new ArrayList<ClsServicio>();
		try {
/*			CREATE PROCEDURE sp_view_coti(int soli) 
			begin
			select * from solicitud as a inner join solicitudservicio as b
			on a.nu_solicitud = b.nu_solicitud inner join  servicio as c
			on b.co_servicio = c.co_servicio inner join tipoServicio as d
			on c.co_tipo_servicio = d.co_tipo_servicio where a.nu_solicitud = soli;
			end
			
			ResultSet rs = sqlDAO.getData("{call sp_view_coti(?)}", new
					Object[]{nro_sol});			
			while(rs.next()){
			clsCot.setNu_solicitud(rs.getInt("nu_solicitud"));
			clsCot.setFe_cotizacion(rs.getString("fe_solicitud"));
			clsCot.setCo_club(rs.getInt("co_club"));
			clsCot.setTx_Club(rs.getString("no_club"));
			ClsServicio objSer = new ClsServicio();
			objSer.setIdService(rs.getInt("co_servicio"));
			objSer.setName(rs.getString("no_servicio"));
			objSer.setMinParticipants(rs.getInt("qt_personas"));
			objSer.setDescription(rs.getString("no_descripcion"));
			objSer.setObservaciones(rs.getString("tx_observaciones"));
			objSer.setCostPerPerson(rs.getDouble("mt_pago"));
		
			clsSer.add(objSer);
			}
			clsCot.setLst_servicios(clsSer);
			
		} catch (Exception e) {
		
			e.printStackTrace();
		}
		return clsCot;
	}
	*/
	
	public ClsCotizacion getCotizacion(int nro_sol){
		ClsCotizacion clsCot = new ClsCotizacion();
		ArrayList<ClsServicio> arrSer = new ArrayList<ClsServicio>();
		try {
			ResultSet rs = sqlDAO.getData("{call sp_view_coti(?) }", new Object[]{nro_sol});
			int i = 0;
			while(rs.next()){
				if (i == 0){
					clsCot.setNu_solicitud(rs.getInt("nu_solicitud"));
					clsCot.setFe_Cotizacion(rs.getString("fe_solicitud"));
					//clsCot.setQt_personas(qt_personas);
					clsCot.setNo_club(rs.getString("no_club"));
					clsCot.setCo_club(rs.getInt("co_club"));
					clsCot.setUsuario(rs.getString("nombres"));
				}
				i++;
				if (rs.getInt("co_servicio")>0){
				ClsServicio serv= new ClsServicio();
				serv.setIdService(rs.getInt("co_servicio"));
				serv.setName(rs.getString("no_servicio"));
				serv.setDescription(rs.getString("no_descripcion"));
				serv.setMinParticipants(rs.getInt("qt_personas"));
				serv.setCostPerPerson(rs.getDouble("mt_pago"));
				serv.setClase(rs.getString("no_tipo_servicio"));
				arrSer.add(serv);
				}
			}
			clsCot.setLst_servicios(arrSer);
/*			CREATE PROCEDURE sp_view_coti(int soli) 
			begin
			select * from solicitud as a inner join solicitudservicio as b
			on a.nu_solicitud = b.nu_solicitud inner join  servicio as c
			on b.co_servicio = c.co_servicio inner join tipoServicio as d
			on c.co_tipo_servicio = d.co_tipo_servicio where a.nu_solicitud = soli;
			end*/
			
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		return clsCot;
	}
		
	
	public ArrayList<ClsCotizacion> getSolicitudes(){
		ArrayList<ClsCotizacion> arrSol = new ArrayList<ClsCotizacion>();
		try {
			ResultSet rs = sqlDAO.getData("{call sp_get_solicitudes()}", new Object[]{});
			while(rs.next()){
				ClsCotizacion obj = new ClsCotizacion();
				obj.setNu_solicitud(rs.getInt("nu_solicitud"));
				obj.setFe_solicitud(rs.getDate("fe_solicitud"));
				obj.setCo_club(rs.getInt("co_club"));
				obj.setUsuario(rs.getString("nombres"));
				obj.setQt_personas(rs.getInt("qt_personas"));
				obj.setNo_club(rs.getString("no_club"));
				arrSol.add(obj);
			}
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		return arrSol;
	}



	
/*	DELIMITER //
	CREATE PROCEDURE sp_add_gen_sol (club int, pers int, co_res int, obs varchar(200), out num_sol)
	begin
	   INSERT INTO `upcweb`.`Solicitud` (`co_estado`, `f
	   e_solicitud`, `qt_personas`, `co_club`, `co_responsable`, `tx_observaciones`)
	   VALUES ('P', current_date(), pers, club, co_res,obs);
	   set num_sol = -1;
	   if row_count() > 0 then
	   set num_sol = (select max(nu_solicitud) from solicitud);
	   end if;
	end
	// DELIMITER
*/	
}
